import _ from 'lodash';
import SQL from '../sql';
import mysql from 'mysql';
import SB from '../../string-buffer';

export default class MySQL2 extends SQL {
    /**
     * 拼接实体引用字符串（默认为mysql标准）
     * @param ids 标识
     * @return {string} 数据库特定的实体引用形式
     */
    id(...ids) {
        return _.compact(ids).map(mysql.escapeId).join('.');
    }

    /**
     * 生成分页查询子句内容（mysql标准）
     * @param offset 起始偏移索引
     * @param limit 记录数量限制
     * @return {string}
     */
    limit(offset, limit) {
        if (offset || limit > 0) {
            return ' LIMIT ' + _.compact([offset, limit]).join(',');
        }
    }

    /**
     * 获取字段类型字符串（SQL）
     * @param type 类型
     * @param length 长度
     * @param decimals 精度
     * @return {*}
     */
    type(type, length, decimals) {
        let t;
        switch (type) {
        case 'int':
        case 'bool':
            t = 'INT';
            break;
        case 'real':
        case 'float':
        case 'double':
        case 'number':
            t = 'DOUBLE';
            break;

        case 'date':
        case 'time':
        case 'datetime':
            t = 'DATETIME';
            break;

        default:
        case 'str':
        case 'string':
            t = 'VARCHAR';
            if (!length) {
                // 字符串必须有长度
                length = 100;
            }
            break;
        case 'text':
            t = 'TEXT';
            break;
        case 'blob':
            t = 'BLOB';
            break;
        }
        const s = new SB(t);
        if (length) {
            s.add('(').add(length);
            if (decimals) {
                s.add(',').add(decimals);
            }
            s.add(')');
        }
        return s.str();
    }

    /**
     * @param opt 除基类属性外，还包括：{
     * charset - 字符集
     * collate - 校对集？
     * }
     */
    createDb(opt) {
        const sql = super.createDb(opt);
        if (opt.charset) {
            sql.add(' CHARACTER SET ').add(opt.charset);
        }
        if (opt.collate) {
            sql.add(' COLLATE ').add(opt.collate);
        }
        return sql;
    }
}
